291991db9b7edfebdba04a61c9f6208c8790b23f,plugins/migration/source/jetbrains/mps/migration20/stages/StubConversionStage.java,StubConversionStage,reResolveStubRefs,#MPSProject#,117

Before Change


    boolean reloadNeeded = false;
    Map<String, SModelReference> globalCache = new HashMap<String, SModelReference>();
    for (IModule module : p.getModules()) {
      Map<String, SModelReference> moduleCache = new HashMap<String, SModelReference>();

      for (SModelDescriptor d : module.getOwnModelDescriptors()) {
        if (!(d instanceof EditableSModelDescriptor)) continue;
        if (!(SModelStereotype.isUserModel(d))) continue;

        Set<SModelReference> toRemove = new HashSet<SModelReference>();
        for (SNode node : d.getSModel().nodes()) {
          for (SReference ref : node.getReferences()) {
            SModelReference targetModel = ref.getTargetSModelReference();
            if (targetModel == null) continue;

            SModelId modelId = targetModel.getSModelId();

After Change


      if (d == null) continue;

      IModule module = d.getModule();
      if (module == null) continue;

      Set<SModelReference> toRemove = new HashSet<SModelReference>();
      for (SNode node : d.getSModel().nodes()) {
        for (SReference ref : node.getReferences()) {
          SModelId modelId = ref.getTargetSModelReference().getSModelId();
          SNodeId nodeId = ref.getTargetNodeId();

          if (modelId instanceof SModelId.RegularSModelId) continue;
          if (ref.getTargetNode() != null) continue;

          String oldId = ((SModelId.ForeignSModelId) modelId).getId();
          SModelReference replacement = null;

          SModelReference cachedReplacement = cache.get(oldId);
          if (cachedReplacement != null && module.getScope().getModelDescriptor(cachedReplacement) != null) {
            replacement = cachedReplacement;
          } else {
            for (SModelDescriptor md : module.getScope().getModelDescriptors()) {
              SModelReference mdRef = md.getSModelReference();
              SModelId mdId = mdRef.getSModelId();
              if (mdId instanceof SModelId.RegularSModelId) continue;
              if (!(matches(oldId, ((SModelId.ForeignSModelId) mdId).getId()))) continue;
              if (md.getSModel().getNodeById(nodeId) == null) continue;

              replacement = md.getSModelReference();
              cache.put(oldId, replacement);
              break;
            }
          }

          if (replacement != null) {
            toRemove.add(ref.getTargetSModelReference());

            SModelReference mr = replacement;
            d.getSModel().addModelImport(mr, false);
            ref.setTargetSModelReference(mr);